iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0
自我挑戰組

掘地土撥鼠的設計歷險記系列 第 10

[補] Object Pool 實際應用

  • 分享至 

  • xImage
  •  

Hi all~~~, 由於一時腦霧忘記補上上篇的應用案例,於是在這篇補上。

Introduction

案例背景:目前有間Apple電腦代工廠,然後他目前生產了三種類的電腦,分別是:"MacBook Pro", "MacBook Air" 以及 "MacBook",而他的發售順序也是由 MacBook Pro 依序至 MacBook。

Coding Time

在此案例中,我們拉出了三個list作爲物件池負責存放物件,分別是:

  • NotYetFashion: 即將販售
  • OnFashion: 當前販售中
  • OldFashion: 將淘汰

UML

https://ithelp.ithome.com.tw/upload/images/20230907/20115082xgU2NBxM6s.jpg

macPool

package Labtop

import "sync"

type Labtop struct {
	Name string
}
type LabtopPool struct {
	sync.Mutex

	NotYetFashion []*Labtop
	OnFashion     []*Labtop
	OldFashion    []*Labtop
}

func InitLabtopPool(notYetFashion []*Labtop) *LabtopPool {
	return &LabtopPool{NotYetFashion: notYetFashion}
}

func (p *LabtopPool) AddToFashionList() {
	p.Lock()

	labtop := p.NotYetFashion[0]
	if len(p.OnFashion) != 0 {
		labotopNeedRetired := p.OnFashion[0]
		p.AddToOldFashionList(labotopNeedRetired)
		p.OnFashion = append(p.OnFashion[:0], p.OnFashion[1:]...)
	}
	p.OnFashion = append(p.OnFashion, labtop)
	p.NotYetFashion = append(p.NotYetFashion[:0], p.NotYetFashion[1:]...)

	p.Unlock()
}

func (p *LabtopPool) AddToOldFashionList( labotopNeedRetired *Labtop) {
	if len(p.OldFashion) != 0 {
		p.OldFashion = append(p.OldFashion[:0], p.OldFashion[1:]...)
	}
	p.OldFashion = append(p.OldFashion, labotopNeedRetired)
}

Main

package main

import (
	"fmt"
	Pool "test/labtopPool"
)

func main() {

	labtopPool := Pool.InitLabtopPool([]*Pool.Labtop{
		{Name: "MacBook Pro"},
		{Name: "MacBook Air"},
		{Name: "MacBook"},
	})

	labtopPool.AddToFashionList()

	labtopPool.AddToFashionList()

	fmt.Println("OnFashion: ", labtopPool.OnFashion[0].Name, " Length: ", len(labtopPool.OnFashion))
	fmt.Println("OldFashion: ", labtopPool.OldFashion[0].Name, " Length: ", len(labtopPool.OldFashion))
	fmt.Println("NotYetFashion: ", labtopPool.NotYetFashion[0].Name, " Length: ", len(labtopPool.NotYetFashion))
}

執行結果

https://ithelp.ithome.com.tw/upload/images/20230907/20115082YMtbpR36TR.jpg

Conclusion

在這個範例中,我們成功地創建了一個LabtopPool結構,該結構用於管理一系列的Labtop物件,分為三個階段:即將販售(NotYetFashion)、販售中(OnFashion)和將淘汰(OldFashion)。

LabtopPool結構內的方法 AddToFashionListAddToOldFashionList 主要是將一個列表移到另一個列表,從而類似於這間Apple電腦代工廠的產品生命週期。此外,透過使用 sync.Mutex,確保了在多線程環境中對該結構的安全訪問,避免了可能的競爭條件。


上一篇
 Composite Pattern - 組合模式
下一篇
Adapter Pattern - 配接器模式
系列文
掘地土撥鼠的設計歷險記11
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言